package es.udc.acs.banco.operations;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import es.udc.acs.database.Database;
import es.udc.acs.database.exception.ConexionInvalidaException;
import es.udc.acs.banco.exceptions.SesionInexistenteException;
import es.udc.acs.banco.sesion.Sesion;

public class DBSesionBancoOperations {

	private DBSesionBancoOperations(){}
	
	private static ByteArrayOutputStream convertirBytes(Object objeto) 
			                                            throws IOException {
	 
		ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
		ObjectOutputStream oos = new ObjectOutputStream(byteArray);
		oos.writeObject(objeto);
	
		return byteArray;
	}
	
	
	public static void crearSesionBanco(String idBanco,
			                            Sesion sesion) 
										throws SQLException, 
										       IOException, 
										       ConexionInvalidaException {
		
		
	    Connection conexion = Database.getInstancia().getConexion();

	    if (conexion!=null) {
	    
			PreparedStatement ps = 
					conexion.prepareStatement(
							"INSERT INTO b_sesion values (? ,null, ?)");
	
			ByteArrayOutputStream byteArray = convertirBytes(sesion); 
			
			// Se inserta en bd
			ps.setString(1, idBanco);
			ps.setBytes(2, byteArray.toByteArray());
			ps.execute();
		
	    } else {	    
	    	throw new ConexionInvalidaException();
	    }

	}
	
	
	public static void guardarSesionBanco(String idBanco,
            							  Sesion sesion) 
            							   throws SQLException, 
            								      IOException, 
            								      ConexionInvalidaException {


		Connection conexion = Database.getInstancia().getConexion();
		
		if (conexion!=null) {
		
			PreparedStatement ps = 
			conexion.prepareStatement(
			"UPDATE b_sesion SET obj_sesion = ? WHERE id_banco = ?");
			
			ByteArrayOutputStream byteArray = convertirBytes(sesion); 
			
			// Se inserta en bd
			ps.setBytes(1, byteArray.toByteArray());
			ps.setString(2, idBanco);
			ps.execute();
		
		} else  {
			throw new ConexionInvalidaException();
		}
		
	}
	
	
	public static Sesion obtenerSesionBanco(String idBanco) 
											throws SQLException, 
											       SesionInexistenteException, 
											       ConexionInvalidaException {
		
	    Connection conexion = Database.getInstancia().getConexion();
	    
	    String sentencia = "SELECT obj_sesion " +
	    				   "FROM b_sesion " +
	    		           "WHERE id_banco = '"+idBanco+"'";

	    if (conexion!=null) {	    	
	    
			Statement stmt   = conexion.createStatement();
	        ResultSet result = stmt.executeQuery(sentencia);	        
	        
	        try {
				result.next();		
				
				Blob blob = result.getBlob("obj_sesion");

			   // Se reconstruye el objeto con un ObjectInputStream
			   ObjectInputStream ois = 
					   new ObjectInputStream(blob.getBinaryStream());
			   
			   Sesion sesion = (Sesion) ois.readObject();
		        
			   return sesion;
			   
			} // result.next() falla porque no hay datos
			catch (Exception e) {
	        	throw new SesionInexistenteException();
			}    
	    }
	    
	    throw new ConexionInvalidaException();
	}
	
	
	public static void borrarSesionBanco(String idBanco) 
										 throws SQLException, 
											    SesionInexistenteException, 
											    ConexionInvalidaException {
								
		Connection conexion = Database.getInstancia().getConexion();

	    if (conexion!=null) {
	    
			PreparedStatement ps = 
					conexion.prepareStatement(
							"DELETE FROM b_sesion WHERE id_banco = ?");
			
			// Se inserta en bd
			ps.setString(1, idBanco);
			ps.execute();
		
	    } else {	    
	    	throw new ConexionInvalidaException();
	    }
	}	
}
